home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2008 February / PCWFEB08.iso / Software / Freeware / Miro 1.0 / Miro_Installer.exe / chrome / content / dnd.js < prev    next >
Encoding:
JavaScript  |  2007-11-12  |  6.2 KB  |  174 lines

  1. /*
  2. # Miro - an RSS based video player application
  3. # Copyright (C) 2005-2007 Participatory Culture Foundation
  4. #
  5. # This program is free software; you can redistribute it and/or modify
  6. # it under the terms of the GNU General Public License as published by
  7. # the Free Software Foundation; either version 2 of the License, or
  8. # (at your option) any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. # GNU General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License
  16. # along with this program; if not, write to the Free Software
  17. # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
  18. */
  19.  
  20. var nsIDragService = Components.interfaces.nsIDragService;
  21. var nsIDragSession = Components.interfaces.nsIDragSession;
  22. var nsITransferable = Components.interfaces.nsITransferable;
  23. var nsISupportsArray = Components.interfaces.nsISupportsArray;
  24. var nsISupportsString = Components.interfaces.nsISupportsString;
  25.  
  26. function writelog(str) {
  27.     Components.classes['@mozilla.org/consoleservice;1']
  28.     .getService(Components.interfaces.nsIConsoleService)    
  29.     .logStringMessage(str);
  30. }
  31.  
  32.  
  33. function getDragAction(effect) {
  34.   if(effect == "copy") return nsIDragService.DRAGDROP_ACTION_COPY;
  35.   if(effect == "move") return nsIDragService.DRAGDROP_ACTION_MOVE;
  36.   if(effect == "link") return nsIDragService.DRAGDROP_ACTION_LINK;
  37.   return nsIDragService.DRAGDROP_ACTION_NONE;
  38. }
  39.  
  40. function getDragData(element) {
  41.   var dragSourceType = element.getAttribute("dragsourcetype") 
  42.   var mimeType = "application/x-democracy-" + dragSourceType + "-drag";
  43.   var transferable = Components.classes[
  44.       "@mozilla.org/widget/transferable;1"].createInstance(nsITransferable)
  45.   transferable.addDataFlavor(mimeType);
  46.   var supportsString = Components.classes[
  47.       "@mozilla.org/supports-string;1"].createInstance(nsISupportsString);
  48.   supportsString.data = element.getAttribute("dragsourcedata");
  49.   transferable.setTransferData(mimeType, supportsString, 
  50.           supportsString.data.length * 2);
  51.   var dragArray = Components.classes[
  52.       "@mozilla.org/supports-array;1"].createInstance(nsISupportsArray);
  53.   dragArray.AppendElement(transferable);
  54.   return dragArray;
  55. }
  56.  
  57. function findDragInfo(startElement) {
  58.   var dragService = Components.classes[
  59.       "@mozilla.org/widget/dragservice;1"].getService(nsIDragService);
  60.   var dragSession = dragService.getCurrentSession();
  61.   if(!dragSession) return null;
  62.  
  63.   var elt = searchUpForElementWithAttribute(startElement, "dragdesttype");
  64.   while(elt) {
  65.     var dragDestType = canElementSupportDrag(elt, dragSession);
  66.     if(dragDestType) {
  67.       return {'dragDestType': dragDestType, 'element': elt};
  68.     } 
  69.     elt = searchUpForElementWithAttribute(elt.parentNode, 'dragdesttype');
  70.   } 
  71.   return null;
  72. }
  73.  
  74. var dragHighlight = {
  75.   highlightedElement: null,
  76.   highlightCSSClass: null,
  77.  
  78.   removeHighlight: function() {
  79.     if(this.highlightedElement) {
  80.       this.highlightedElement.className = 
  81.         this.highlightedElement.className.replace(this.highlightCSSClass, "");
  82.       this.highlightedElement = null;
  83.     }
  84.   },
  85.  
  86.   setHightlight: function(element, type) {
  87.     this.removeHighlight();
  88.     if(element.className) {
  89.       this.highlightCSSClass = " drag-highlight " + type;
  90.     } else {
  91.       this.highlightCSSClass = "drag-highlight " + type;
  92.     }
  93.     element.className += this.highlightCSSClass;
  94.     this.highlightedElement = element;
  95.   }
  96. };
  97.  
  98. function onDragGesture(event, browser) {
  99.   var element = searchUpForElementWithAttribute(event.target,
  100.     "dragsourcetype");
  101.   if(element) {
  102.     var dragService = Components.classes["@mozilla.org/widget/dragservice;1"].getService(nsIDragService);
  103.     if(!dragService.getCurrentSession()) {
  104.       event.stopPropagation();
  105.       var dragArray = getDragData(element);
  106.       dragService.invokeDragSession(null, dragArray, null,
  107.           nsIDragService.DRAGDROP_ACTION_COPY);
  108.     } 
  109.   } 
  110. }
  111.  
  112. function canElementSupportDrag(element, dragSession) {
  113.   var dragDestTypes = element.getAttribute("dragdesttype").split(":");
  114.   for(var i = 0; i < dragDestTypes.length; i++) {
  115.     var dragDestType = dragDestTypes[i];
  116.     var mimeType = "application/x-democracy-" + dragDestType + "-drag";
  117.     if(dragSession.isDataFlavorSupported(mimeType)) return dragDestType;
  118.   }
  119.   return false;
  120. }
  121.  
  122. function onDragOver(event, browser) {
  123.   var dragService = Components.classes["@mozilla.org/widget/dragservice;1"].getService(nsIDragService);
  124.   var dragSession = dragService.getCurrentSession();
  125.   if(!dragSession) return;
  126.  
  127.   var canDrop = false;
  128.   
  129.   var dragInfo = findDragInfo(event.target);
  130.   if(dragInfo) {
  131.     var elt = dragInfo['element'];
  132.     var dragDestType = dragInfo['dragDestType'];
  133.     var dragEffect = elt.getAttribute('drageffect' + dragDestType);
  134.     dragSession.dragAction = getDragAction(dragEffect);
  135.     dragHighlight.setHightlight(elt, dragDestType);
  136.     canDrop = true;
  137.   } 
  138.   dragSession.canDrop = canDrop;
  139.   if(!canDrop) dragSession.dragAction = nsIDragService.DRAGDROP_ACTION_NONE;
  140.  
  141.   event.stopPropagation();
  142. }
  143.  
  144. function onDragExit(event, browser) {
  145.    if(event.screenX == 0 && event.screenY == 0) {
  146.      dragHighlight.removeHighlight();
  147.    }
  148. }
  149.  
  150. function onDragDrop(event, browser) {
  151.   dragHighlight.removeHighlight();
  152.   var dragInfo = findDragInfo(event.target);
  153.   if(dragInfo) {
  154.     var elt = dragInfo['element'];
  155.     var dragType = dragInfo['dragDestType'];
  156.     var dragService = Components.classes[
  157.         "@mozilla.org/widget/dragservice;1"].getService(nsIDragService);
  158.     var dragSession = dragService.getCurrentSession();
  159.     if(dragSession) {
  160.       var dragDestData = elt.getAttribute("dragdestdata");
  161.       var trans = Components.classes[
  162.         "@mozilla.org/widget/transferable;1"].createInstance(nsITransferable)
  163.       var mimeType = "application/x-democracy-" + dragType + "-drag";
  164.       trans.addDataFlavor(mimeType);
  165.       dragSession.getData(trans, 0);
  166.       var rawData = new Object();
  167.       var length = new Object();
  168.       trans.getTransferData(mimeType, rawData, length);
  169.       var sourceData = rawData.value.QueryInterface(nsISupportsString);
  170.       pybridge.handleDrop(dragDestData, dragType, sourceData.data);
  171.     }
  172.   }
  173. }
  174.